package cn.com.w.bootdemo.util;

import java.io.IOException;
import java.net.URL;
import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>配置文件读取对象</p>
 * 读取类路径下（包含 classes和jar包）所有的 config/config.properties 中的配置
 * <p>
 * 如果classes目录下和jar包中都存在该文件，则：
 * classes目录中的配置可以覆盖jar包中的相同配置
 *
 * @author zhangxl 2021.5.26
 * @version 1.0
 */
public class Configuration {
    /**
     * LOG
     */
    private final static Logger LOG = LoggerFactory.getLogger(Configuration.class);

    /**
     * 属性配置文件
     */
    private static Properties properties = new Properties();

    /**
     *
     */
    private static final String path = "config/config.properties";

    static {
        try {
            Enumeration<URL> configs = Configuration.class.getClassLoader().getResources(path);
            List<Properties> classProperties = new ArrayList<Properties>();
            while (configs.hasMoreElements()) {
                URL config = configs.nextElement();
                if (LOG.isDebugEnabled())
                    LOG.debug("load config: " + config.getFile());

                Properties pro = new Properties();
                pro.load(config.openStream());
                if (config.getPath().contains("classes/") &&
                        !config.getPath().contains(".jar!")) {
                    classProperties.add(pro);
                } else {
                    properties.putAll(pro);
                }
            }
            // 确保classes目录下的config配置可以覆盖jar包中的配置。
            if (!isEmpty(classProperties)) {
                for (Properties p : classProperties) {
                    properties.putAll(p);
                }
            }
        } catch (IOException e) {
            LOG.error("", e);
        }
    }

    /**
     * 私有构造方法，禁止对该类进行实例化
     */
    private Configuration() {
    }

    /**
     * 根据key获取配置value，默认值为null。
     *
     * @param key 配置的属性名称
     * @return String 属性值
     */
    public static String getConfig(String key) {
        return getConfig(key, null);
    }

    /**
     * 根据key获取配置value，默认值为defaultValue。
     * <p>
     * 当属性文件中不存在key，则返回默认值为defaultValue。
     * 当属性文件中对应key的value为空，则返回空字符串""。
     *
     * @param key          配置的属性名称
     * @param defaultValue 默认值
     * @return String       属性值
     */
    public static String getConfig(String key, String defaultValue) {
        return properties.getProperty(key, defaultValue);
    }

    /**
     * 返回配置文件所有的key-value
     *
     * @return HashMap<String, String>
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static Map<String, String> getConfigurations() {
        Map map = new HashMap();
        map.putAll(properties);
        return map;
    }

    /**
     * 判断集合是否为空
     *
     * @param collection 集合
     * @return
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

}
